﻿using Dapper;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using WebApplication1.App_Code;
using WebApplication1.FBUtil.TypeConverter;
using WebApplication1.Models;

namespace WebApplication1.Controllers.Api
{
    public class TestController : BaseController
    {
        /*
        确实限制为了 get 请求。http://localhost:26652/api/v1/test/test。
        
        postman 使用 post 请求时，得到的响应是：
            “/”应用程序中的服务器错误。
            无法找到资源。
            说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除，或其名称已更改，或暂时不可用。请检查以下 URL 并确保其拼写正确。
            请求的 URL: /api/v1/test/test
            版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.8.4075.0
        
        另外：
        get 请求得到的响应头是 text/html; charset=utf-8，这是需要修改的。
         */
        // GET: Test
        [HttpGet]
        public string Test()
        {
            return "{\"errcode\": 200}";
        }

        [HttpGet]
        public string Test2()
        {
            // 这三个都返回给客户端了。
            // Response.AddHeader("Resp-Box", "aaa");
            // Response.AddHeader("Resp-Box", "bbb");
            // Response.AppendHeader("Resp-Box", "ccc");

            // 顺便记录一下。
            // Response.AddHeader("Content-Disposition", "Attachment;filename=targetFileName.pdf");

            // 有效。
            Response.ContentType = "application/json; charset=utf-8";

            return "{\"errcode\": 200}";
        }

        // 失败，返回的还是 text/html。
        [HttpGet]
        public ActionResult Test4()
        {
            System.Diagnostics.Debug.WriteLine("====================Setting START===================");
            Object result;
            /*
            string cronTime = "* /10 * * * * ?";// 注意这里 * /10 之间本来没有空格的，只是因为注释原因才特地添加了空格。
            Dictionary<string, object> map = new Dictionary<string, object>();
            map.Add("channel", 0);
            map.Add("quaility", 6);
            map.Add("imageSize", 2);
            string jobName = Constants.CAPTURE_JOB_KEY_PREFIX + "cameraIds";
            System.Diagnostics.Debug.WriteLine("创建名称为【" + jobName + "】，表达式为【" + cronTime + "】的定时任务");
            await QuartzUtil.AddJob<CaptureJob>(jobName, cronTime, map);
            */
            result = new
            {
                error = "SUCCESS",
                error_info = "调用成功"
            };

            string jsonstr = JsonConvert.SerializeObject(result);
            System.Diagnostics.Debug.WriteLine("====================Setting END===================");
            return Content(jsonstr);
        }


        [HttpGet]
        public JsonResult Test5()
        {
            System.Diagnostics.Debug.WriteLine("====================Setting START===================");
            Object result = new
            {
                error = "SUCCESS",
                error_info = "调用成功"
            };

            //string jsonstr = JsonConvert.SerializeObject(result);
            System.Diagnostics.Debug.WriteLine("====================Setting END===================");

            // postman 发送请求时，json 响应被阻止了，因为提示不安全：
            /*
             *“/”应用程序中的服务器错误。
             * 此请求已被阻止，因为当用在 GET 请求中时，会将敏感信息透漏给第三方网站。若要允许 GET 请求，请将 JsonRequestBehavior 设置为 AllowGet。
             * 说明: 执行当前 Web 请求期间，出现未经处理的异常。请检查堆栈跟踪信息，以了解有关该错误以及代码中导致错误的出处的详细信息。 
             * 异常详细信息: System.InvalidOperationException: 此请求已被阻止，因为当用在 GET 请求中时，会将敏感信息透漏给第三方网站。若要允许 GET 请求，请将 JsonRequestBehavior 设置为 AllowGet。
             * 源错误: 
             * 执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
             * 堆栈跟踪: 
             * [InvalidOperationException: 此请求已被阻止，因为当用在 GET 请求中时，会将敏感信息透漏给第三方网站。若要允许 GET 请求，请将 JsonRequestBehavior 设置为 AllowGet。]
             * System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context) +443
             * ...
             */
            // return Json(result);

            // 解决方案是：使用重载的方法。
            // 成功。postman 得到响应：application/json; charset=utf-8。
            return Json(result, JsonRequestBehavior.AllowGet);
        }

        [HttpGet]
        public JsonResult Test6(string id)
        {
            System.Diagnostics.Debug.WriteLine("path 参数 id：{0}", new Object[]{ id });
            System.Diagnostics.Debug.WriteLine("path 参数 id==null：{0}", id == null);
            System.Diagnostics.Debug.WriteLine("path 参数 id==''：{0}", "".Equals(id));

            SqlMapper.AddTypeHandler(typeof(string), new GuidAndString());
            List<UserModel> userList = null;
            using (MySqlConnection connection = new MySqlConnection(DapperApi.ConnectionString))
            {
                string sql = "SELECT id,so_name AS Name,so_account AS Account,so_type AS Type FROM sys_user";
                if (id == null)
                {
                    userList = connection.Query<UserModel>(sql).ToList();
                }
                else
                {
                    sql += $" WHERE so_type=@Id";
                    userList = connection.Query<UserModel>(sql, new { Id = id}).ToList();
                }
            }

            System.Diagnostics.Debug.WriteLine(userList);
            System.Diagnostics.Debug.WriteLine(userList == null);
            System.Diagnostics.Debug.WriteLine(userList.Count);

            return Json(userList, JsonRequestBehavior.AllowGet);
        }

        [HttpGet]
        public JsonResult Test7()
        {
            SqlMapper.AddTypeHandler(typeof(string), new GuidAndString());
            List<UserModel> userList = null;
            using (MySqlConnection connection = new MySqlConnection(DapperApi.ConnectionString))
            {
                string sql = "SELECT id,so_name AS Name,so_account AS Account FROM sys_user WHERE id='123'";
                userList = connection.Query<UserModel>(sql).ToList();
            }

            System.Diagnostics.Debug.WriteLine(userList);
            System.Diagnostics.Debug.WriteLine(userList == null);
            System.Diagnostics.Debug.WriteLine(userList.Count);

            return Json(userList, JsonRequestBehavior.AllowGet);
        }
    }
}